#ifndef _KRLINTRPT_T_H_
#define _KRLINTRPT_T_H_

#include <hyper_t.h>
#include <spinlock_t.h>
#include <list_t.h>

/* 
 * 中断回调函数指针 函数原型
 * uint_t irqnbr   -- 中断号
 * void * device   -- 设备指针
 * void * stackptr -- 中断栈指针
 */

typedef drvstus_t (*inthandle_t) (uint_t ifidx, void * device, void * stackptr);

/* 中断源数据结构 (静态) */

typedef struct s_INTSRCDSC 
    {
    spinlock_t lock;            /* 保护自身结构体的锁 */
    list_t     isrlist;         /* 设备中断服务程序链表 */
    uint_t     isrnbr;          /* 中断服务程序个数 */
    u32_t      flag;            /* 相关标志位 (中断类型) */
    u32_t      status;          /* 相关状态位 */
    u32_t      pndbitidx;       /* 中断源挂起寄存器中的位序 (不同类型中断在各自分类里的序号) */
    uint_t     irqnbr;          /* 中断号 (所有类型中断) */
    uint_t     deep;            /* 保留 */
    uint_t     gnrtcnt;         /* 产生中断的次数 */
    } intsrcdsc_t;

/* 中断回调函数描述符 (驱动程序动态分配建立) */

typedef struct s_INTISRDSC
    {
    list_t        list;          /* 挂载在 intsrcdsc_t 结构体的 isrlist 上 */
    list_t        devlist;       /* 挂在设备描述符的相关链表上 */
    u32_t         flag;          /* 相关标志位 */
    intsrcdsc_t * intsrcdsc;     /* 指向 所在的 intsrcdsc_t (快速找到intsrcdsc_t) */
    void *        device;        /* 指向其设备描述符 (找到是哪个设备的中断) */
    uint_t        refcnt;        /* 该中断回调函数的运行计数 */
    inthandle_t   handle;        /* 回调函数的函数指针 (保存函数地址) */
    } intisrdsc_t;

#endif